home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / web / nuweb / msdos / arena.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-01  |  990 b   |  52 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. typedef struct chunk {
  6.   struct chunk *next;
  7.   char *limit;
  8.   char *avail;
  9. } Chunk;
  10. Chunk first = { NULL, NULL, NULL };
  11. Chunk *arena = &first;
  12. void *arena_getmem(n)
  13.      int n;
  14. {
  15.   char *q;
  16.   char *p = arena->avail;
  17.   n = (n + 3) & ~3;             /* ensuring alignment to 4 bytes */
  18.   q = p + n;
  19.   if (q <= arena->limit) {
  20.     arena->avail = q;
  21.     return p;
  22.   }
  23.   {
  24.     Chunk *ap = arena;
  25.     Chunk *np = ap->next;
  26.     while (np) {
  27.       char *v = sizeof(Chunk) + (char *) np;
  28.       if (v + n <= np->limit) {
  29.         np->avail = v + n;
  30.         arena = np;
  31.         return v;
  32.       }
  33.       ap = np;
  34.       np = ap->next;
  35.     }
  36.     {
  37.       int m = n + 10000;
  38.       np = (Chunk *) malloc(m);
  39.       np->limit = m + (char *) np;
  40.       np->avail = n + sizeof(Chunk) + (char *) np;
  41.       np->next = NULL;
  42.       ap->next = np;
  43.       arena = np;
  44.       return sizeof(Chunk) + (char *) np;
  45.     }
  46.   }
  47. }
  48. void arena_free()
  49. {
  50.   arena = &first;
  51. }
  52.